II. Data Cleaning in R


Pre-requisites

Dataframe names:

  • df_trips_YYYYMM: raw data input for each month
  • df_trips_all_raw: merged data of all months
  • df_trips_all_clean_xxx: cleaned data
  • df_trips_all_trans: added columns for duration, weekdays, hours
  • df_trips_all_fct: format categorical variables into factors
  • df_trips_all_final: removed outliers
  • df_trips_all_final_dense: removed non essential columns

Install and load packages:


1 Importing raw data

1.1 Importing data

Datasets

Please download the following data files from the [Link] (https://divvy-tripdata.s3.amazonaws.com/index.html) and copy them into your working directory “data” of RStudio

Data set: ‘202201-divvy-tripdata.csv’ (data for one month Jan. 2022)
Data set: ‘202202-divvy-tripdata.csv’ (data for one month Feb. 2022)
Data set: ‘202203-divvy-tripdata.csv’ (data for one month Mar. 2022)
Data set: ‘202204-divvy-tripdata.csv’ (data for one month Apr. 2022)
Data set: ‘202205-divvy-tripdata.csv’ (data for one month May. 2022)
Data set: ‘202206-divvy-tripdata.csv’ (data for one month Jun. 2022)
Data set: ‘202207-divvy-tripdata.csv’ (data for one month Jul. 2022)
Data set: ‘202208-divvy-tripdata.csv’ (data for one month Aug. 2022)
Data set: ‘202209-divvy-tripdata.csv’ (data for one month Sep. 2022)
Data set: ‘202210-divvy-tripdata.csv’ (data for one month Oct. 2022)
Data set: ‘202211-divvy-tripdata.csv’ (data for one month Nov. 2022)
Data set: ‘202212-divvy-tripdata.csv’ (data for one month Dec. 2022)

Reading 12 CSV files into separated dataframes from the local storage:


1.2 Union data

Next we will merge all 12 dataframes into one single dataframe with all the raw data.

Result:

  • Numbers of rows: 5,667,717
  • Numbers of columns: 13



2. Cleaning the data


2.1 Check data integrity

2.1.1 Check numbers of NAs

Result:

  • About 1.7 million start or end station names are missing.
  • Geo-codes are mostly available. However, the reconstruction of station names from geo-codes would require a more deep-dive into map-matching and is out of the scope of this project. We, therefore have to remove all rows with NAs, which is acceptable since we still have about 75% of data left.


2.1.2 Check time range


Result:

  • max end datetime exceeded by two days (2023-01-02). This will be cleaned in the outlier removal step

2.1.3 Check for time dependency issues


Result:

  • There are 100 observations with a time conflict. These rows will be removed.

2.1.4 Check distinct values


Result:

  • Distinct numbers of bike types (3) and users (2) are plausible
  • Distinct number of start and end station (1693) is exceeding the amount of stated 600 docking stations. The stations listed in the dataset may include different names for the same docking station as well as non-docking locations. Since we have no further information, we will treat all 1693 stations as valid.

2.1.5 Check for location outliers

Create a dataframe for stations:


Plot station location as virtual map:

There are stations far from Chicago area, probably testing stations. We will neglect these stations and set the area boundary of GCA to:

  • Longitude : [-88.0, -87.0]
  • Latitude : [41.4, 42.4]

The following stations are identified as outliers:

11 stations are outside of greater Chicago area. They will be removed in the later cleaning process.


2.2 Cleaning the data

2.2.1 Remove NAs

There are plenty of rows with missing values, related to missing recordings of start and end stations. All rows with NAs will be removed.

Remove rows with missing values:


Result:

  • Number of rows removed (with NAs): 1,298,357 (23%)
  • Number of rows remaining (no NAs): 4,369,360


2.2.2 Remove service stations:

Service stations for maintenance or charging tests should be removed from the dataset. Our first guess was that they can be identified by their long station ID names. However, it turned out that some docking stations with charging devices for electric bikes have long ID names as well. After a review of the 1600 station IDs we identified the following service station names:

  • station IDs with name “Pawel Bialowas - Test- PBSC charging station” (length 44)
  • station IDs with name “DIVVY CASSETTE REPAIR MOBILE STATION” (length 36)
  • station IDs with name “Hubbard Bike-checking (LBS-WH-TEST)” (length 35)
  • station IDs with name “DIVVY 001 - Warehouse test station” (length 34)
  • station IDs with name “2059 Hastings Warehouse Station” (length 31)
  • station IDs with name “Divvy Valet - Oakwood Beach” (length 27)
  • station IDs with name “Hastings WH 2” (length 13)


Result:

  • Removed number of rows with service stations: 1,507
  • Remaining number of rows: 4,367,853


2.2.3 Remove location outliers


Result:

  • Number of removed stations: 8
  • Number of remaining rows : 4,367,845


2.2.4 Remove duplicate rows

In order to detect and remove duplicates we will compare all columns except the unique ride_id:

Result:

  • Number of duplicate rows removed: 22
  • Number of remaining rows: 4,367,823


2.3 Handling dates

The imported data with time-stamps for start and end time are recorded in local time (“America/Chicago” Central Time). In order to account for daylight saving time (DST) the data and system environment of RStudio have to be set to the same local time-zone (TZ).

2.3.1 Setting the correct time-zone

The time-zone of the imported raw data are set by default to TZ = “UTC”. Since the time-stamps were recorded in local time we have to change the time zone of the data and the system environment.
Note: The local standard time-zone like (CST - Central Standard Time) does not have daylight saving times and using it will result in wrong ride-time calculations.

Set the system environment TZ:


Setting the system time to local time “America/Chicago”:

Result: System time-zone set to “America/Chicago”

Set date TZ:


Forcing TZ “America/Chicago” on time-stamps:

Result: Date time-zone set to “America/Chicago”


2.3.2 Correcting for Daylight Saving Time

Spring: Advancing clock - time gap

In spring on 2022-03-13 02:00:00 the time is advanced by 1 hour. There is no time recording for 02:00:00 - 02:59:59. I.e. 01:59:59 + 1 sec = 03:00:00. Ride-time calculation by simple subtraction will create an error of +60 min. The calculation will be automatically corrected by the function difftime()

Checking the correct calculation for rides during the time gap:

  Result: Calculation is correct. Time gap of 60 minutes skipped in calculation

Fall: Returning clock - time lap

In autumn on 2022-11-06 02:00:00 the time is returned by 1 hour. The time between 01:00:00 and 01:59:59 is recorded twice. To eliminate ambiguity, the time would have had to be measured in UTC (e.g. GPS tracker). In our data set however the time is measured in local time. Thus we cannot determine whether the time stamp belongs to the first path (before DST switch) or the second path (after DST switch). Therefore, we will remove all time stamps originated or ended between 1am to 2am. Rides originated before 1am and ended after 2am will be automatically corrected by the function difftime()

Number of dates time slot at DST lap:

Result: 341 rows are affected

Removing dates from time slot at DST lap:


Result:

  • Number of rows removed: 341
  • Number of rows remaining: 4,367,482


2.3.3 Remove rows with time dependency conflict: starttime > endtime

There are still some rides where the end time is before the start time.

Result: There are 37 rides with negative ride time. All rides originated and ended at the same station

Remove rides with datetime dependency conflict:

Result:

  • Number of rows with time conflicts removed: 37
  • Number of remaining rows: 4,367,445



2.4 Transform data

2.4.1 Add calculated variables for duration, weekdays, and hours

For further analysis we will now calculate the ride time (duration) and extract year, month_name, day_name and hour from start time.


2.4.2 Format categorical variables to factors

We will now convert categorical variables into factors with defined ordered levels. This will allow us to apply useful graphics:


2.4.3 Add sub-groups for time categories:

We will now add sub-groups for season, week and day defined as follows:

  • season: winter, spring, summer, autumn
  • day_type: weekend, workday
  • hour_type: night, morning, afternoon, evening



2.5 Treatment of outliers

2.5.1 Identify outliers

First let’s explore the distribution of ride_time by user group and bike type to identify possible outliers.

Result:

  • max ride time classic bikes is 1499 min (about 24 hours)
  • max ride time of electric bikes is 480 min (8 hours)
  • max ride time of docked bikes is 32,000 min (about 22 days)
  • min ride time is zero for all groups

To get more insight into the data we will use histograms for each group:



Result: apparently only the docked_bike type shows outliers. Let’s zoom-in to ride time 1,500 minutes:



Result:

  • ride time with classic bikes is capped at around 1500 min in both user groups.
  • ride time with electric bikes is capped at around 500 min in both user groups.
  • ride time with docked bikes has values beyond 1500 min.

We don’t see evidence for outliers in groups classic bike and electric bike due to its continuous distribution, However, in the case of docked bikes we see an sudden change in the pattern, a kind of noise starting from 1500.
Therefore, the upper threshold to remove outlier will be set to 1500 minutes.

We make the decision to set the lower threshold to 1 minute. Rides less than 1 minute can be classified as bike management to dock and release bikes in order to reset the rent status. For more details see DIVVY pricing program in chapter IV. Appendix.

2.5.2. Remove outliers

Now, after we have defined the boundary values [1, 1500] let’s remove the outliers:


Result:

  • Removed outliers: 76,473
  • Remaining rows: 4,290,971


2.6 Export cleaned data frame

2.6.1 Remove irrelevant variables

The following variables will be removed from the dataframe, as they are not essential for the further analysis

  • ride_id
  • ended_at
  • start_station_id
  • end_station_id
  • year


2.6.2 Export cleaned file


NOTE: ordered factor setting will be lost in the CSV file. Therefore, we will create an RDS file that can be used to in the rMarkdown file for analysis.


III. Data Analysis in R

Pre-requisites

Global settings for scale and color:


For better readability we will rename the long dataframe name into a short name:


Dataframe names:

  • df: dataframe with cleaned data
  • df_corr: dataframe for correlation analysis
  • color_table: dataframe with color definition



3. Data analysis and visualization


3.1 Descriptive statistics

3.1.1 Distribution of ride-time in a histogram graph

Let’s first get an overview of the ride-time distribution in each group by histograms:


Result:

  • The shapes of both distributions are similar, skewed to the right (long tail)
  • The distribution of casuals is slightly wider than that of members

3.1.2 Key measures as table

Next let’s calculate for each user group the totals, mean, standard deviation and other statistical measures:


3.1.3 Key measures as bar graphs

Graph: Total number of rides, total ride-time and average ride-time by user group. In a skewed distribution the average-value (mean) is not so meaningful, instead we will use the median-value:

Result:

  • Members have more rides per year than casuals
  • Casuals have longer total ride-time
  • Casuals’ median ride-time is about 5 minutes longer that that of members’ ride-time


3.1.4 Key measures by boxplot

For better understanding of the ride-time distribution we will use a boxplot:

  How to read the boxplot:

  • The middle line marks the mid-point at 50% or median (middle quartile)
  • The lower box line (lower quartile) marks 25% of all values, the upper box line (upper quartile) marks 75% of all values, the box height contains, therefore, 50% of all values (ride-time),
  • The extended vertical lines (whiskers) represent more extreme values. The longer these lines are the higher the spread is
  • Every values below or above the whiskers are potential outliers
  • The big dot mark in the box is the mean value. For ideal normal distribution the median and the mean should be the same or very close

Results for casuals:

  • 75% of rides by casuals are shorter than 26 min
  • 50% of values (IQR) are between 8 to 26 min
  • The median point (mid-point) is at 14 min
  • The mean point is at 24 min
  • The spread is wide and even more skewed because mean and median are far apart

Results for members:

  • 75% of rides by members are shorter than 16 min
  • 50% of values (IQR) are between 5 to 16 min
  • The median point (mid-point) is at 9 min
  • The mean point is at 13 min
  • The spread is more contained around the median and mean, i.e annual members typical ride-time is quite constant

3.1.5. Log transform ride-time data for normalization

Since the data are highly skewed a statistical test, like t-test, is not meaningful. The data can however be normalized using a log transformation.

Preparing a dataset with log-trans values:


Histogram of log-trans values:


Result: the distribution is now normalized

Boxplot of log-trans values:


Result: The boxplots are now symmetric, i.e. normalized, mean and median are almost identical.


T-test to test if the difference in mean between groups is statistically significant:

  • Ho-hypothesis: there is no significant difference between both means
  • Ha-hypothesis (alternative): there is a significant difference between both means

Result:

  • The mean values calculated through the log10 transformation are very close to the median and their difference is statistical significant with p-value = 0
  • geometric mean casual = 15.0
  • geometric mean member = 9.2

3.1.5 Conclusion: Descriptive statistical values

  • The distribution of ride-time in both groups is skewed to the right, i.e. concentration of shorter rides and fewer longer rides
  • Annual members ride more than casual riders over the year
  • Annual riders accumulate more ride-time over the year than annual members
  • The median ride-time (equivalent to geom. mean) of casual riders is significantly higher than for annual members
  • The ride-time of casual riders shows more fluctuations, whereas the ride time of members is more contained around the mid-point


3.2 Time dependencies

3.2.1 Number of rides as time series

Let’s first get an overview of the whole year cycle by number of rides aggregated by day:


Result:

  • Both signals show multiple overlapping cycles of different frequencies over year, week and day
  • There are similarities but also differences

Let’s brake down the signal by month, day and hour:


3.2.2 Annual cycle by month

We will plot the number of rides over year aggregated by months in absolute values and in relative values
Relative frequency is calculated by : frq_rides = n_month/n_year per group:

Results:

  • Both, casuals and members, show similar behavior over the year: Increase of rides in warmer months and decrease in colder months
  • The number of rides by casuals is almost dropping down to zero in winter months January and February
  • Relatively, casuals show a steeper increase of rides in warmer months compared to members

Average ride-time by month:


Results:

  • The average ride-time of casuals is longer compared to members throughout the year
  • The average ride-time of members is almost constant over the year, i.e. less dependent on seasons
  • The average ride-time of casuals is longer in the warmer months, with peaks in March and May


3.2.3 Weekly cycle by day

Now, let’s plot the number of rides over a weak aggregated by days in absolute values and in relative values
Relative frequency is calculated by : frq_rides = n_day/n_year per group:

Results:

  • Casuals and members, show opposite behavior over the week
  • Members ride more on workdays, Monday to Friday, and less on weekends
  • Casuals ride more on weekends and less on workdays
  • The rides of casuals increases sharply on weekends

Average ride-time by day:


Results:

  • The average ride-time of casuals is longer compared to members at all time
  • The average ride-time of members is almost constant over the week, with slight increase on weekends
  • The average ride-time of casuals is lowest on Wednesday and highest on Sunday, i.e. casuals ride longer from Friday to Monday


3.2.4 Daily cycle by hour

Finally, let’s plot the number of rides over a day aggregated by hours in absolute values and in relative values
Relative frequency is calculated by : frq_rides = n_hour/n_year per group:


Results:

  • The graph shows a substantial difference in ride behavior between members and casuals:
  • Members show two relative maximums, one in the morning (8am) and one in the afternoon (5pm), i.e. member use their bikes mainly for commuting
  • Rides of casuals gradually increases from morning to afternoon (5pm). The graph shows no peak at the morning commute.i.e. casuals seam to use their bikes for other reasons than for commuting

Average ride-time by hour:


Results:

  • The average ride-time of casuals is higher compared to members at all time
  • The average ride-time of members is almost constant at 13 minutes over the day, i.e. less influenced by the hour
  • The average ride-time of casuals is longest from 9am to 5pm and lowest from 4am to 8am


3.2.5 Conclusions: Time dependencies by month, weekday and hours

Year:

  • The number of ride cycle over the year follows the same pattern in both groups, no significant differences due to season can be observed
  • Both groups show an increase of rides in warmer seasons and decrease in colder seasons
  • However, casuals show a steeper increase of rides in warmer months, and a drop close to zero in January and February
  • The average ride time for casuals is increasing in warmer months, highest from March to May
  • The average ride time of members is almost constant over the year

Week:

  • Casuals prefer riding on weekends, whereas members ride is highest on workdays
  • The average ride time of casuals increases on weekends more than for members

Day:

  • Members prefer riding during commute time in the morning and afternoon hours
  • Casuals riders, however, show no commute behavior, instead they prefer to ride in the afternoon, assumingly for leisure
  • The average ride time of casuals is longer during the daytime than at evening and night time
  • The average ride time of members is constant all over the day


3.3 Usage of bike-types

We will now break down the analysis further by bike-type classic bike and electric bike to get an insight whether there are significant differences between the user groups:

3.3.1 Number of rides (in percentage)


Results:

  • The preferred bike-type in both groups are classic bikes/
  • Casuals are more in favor of electric bikes than members (40% against 34%) although the pricing of electric bikes for non-members is $0.42/min and for members is only $0.17/min
  • The case study does not provide an explanation of docked bikes. Since they are only used by casuals we exclude this type from the further analysis

    Let’s look more deeply into the usage of each bike-type by month, week and hour

3.3.2 Dependency by month and day

Total rides per bike-types aggregated by month for weekend and workday:


Results:

  • On weekends and in summer casuals use more E-bikes than members
  • On workdays and in summer casuals show an increase usage of E-bikes
  • The usage of classic bikes follows a similar pattern in both user groups

3.3.3 Dependency by hour and season (electric bikes)

Total rides of electric bikes aggregated by hour for different seasons at weekend and workday:


Results:

  • On weekend and in summer casuals use significantly more E-bikes than members
  • On workdays surprisingly casuals show a slight peak at the morning commute, indicating that a proportion of casual riders use their E-bike for commuting and are potential customers to convert to annual memberships

3.3.4 Dependency by hour and season (classic bikes)

Total rides of classic bikes aggregated by hour for different seasons, weekend and workday:


Results:

  • On weekend and in warmer season almost identical usage of classic bikes, but fewer rides by casuals in autumn and winter
  • On workdays casuals show a tiny peak also in the morning commute but less than electric bike user, indicating that casuals do not use classic bikes much for commuting
  • In general casuals have high demand of rides in warmer seasons but very low demand in colder seasons


3.3.5 Conclusion: Usage of bike-types

  • Casuals are more in favor of electric bikes than members
  • On summer and spring weekends casuals use more electric bikes than members
  • Casual use electric bikes to some extend also for morning commute, and may be potential customers for memberships


3.4 Spatial distribution

3.4.1 Top 20 start stations

Next, let’s display the top 20 stations for casuals and members.
For the map visualization we used ggmap and geom_point. The map was pulled from Google Map. A Google Map API is required. We will skip the code here, since the map creation code was quite lengthy. If there is any interest please let me know.

The following maps were created with ggmap and Google Map API:


Results:

  • Top 20 stations for casuals are concentrated along the lake shore and in park areas. The ride frequency of the top 20 stations ranges from 50K - 20K
  • Top 20 stations for members are in the city center, business area, and university campuses. The ride frequency of the top 20 station ranges from 22K to 16K, and is more equally distributed compared to casuals

3.4.2 Density map of rides by location

A density map visualizes the number of rides accumulated over the full time span and mapped to the location of start stations. The range is sliced in 50 levels. Each level is assigned to a color and bounded by a polygon.
For the visualization we used ggmap and stat_density2d function. The map was pulled from Google Map. A Google Map API is required. We will skip the code here, since the map creation code was quite lengthy. If there is any interest please let me know.


Results:

  • Location wise stations used by casual riders are more concentrated in the city and along the lake shore. The frequency range per start station is between 400 and 1600 rides.
  • Stations used by annual members are much wider spread over greater Chicago area (Evanston to Hide Park). The frequency ranges per start station from 200 to 600 rides and is more equally distributed.


3.4.3 Conclusion: Differences by location

  • Casuals have a preference for locations along the lake shore and in park areas
  • Members have a preference for locations in the city’s business districts and around university campuses
  • Casual riders are more concentrated in the city and along the lake shore, with few hot-spots
  • Annual members are more wide spread over greater Chicago area


3.5 Modeling

3.5.1 Identify correlations between members and casuals

Relationships (correlations) between casuals and members can be best visualized in scatter plots. We therefore plot the number of rides of casuals on the x-axis and the number of rides of members on the y-axis.

If the groups are correlated, than we can infer that the behavior is not different
If the groups are only weakly correlated, we can infer that a difference in behavior exists

We will then use a simple linear regression model provided by geom_smooth (method = lm). The coefficients of the model are not accessible from geom_smooth. However, we can calculate the R-value with a simple function that provides a measure of correlation (+/- 1 for high correlation and 0 for no correlation). The regression slop values are manually calculated from the graphs.

3.5.2 Prepareing the data set

We will create a new dataframe df_corr to aggregate the number of rides by hour. The data points will be reduced to about 8700 rows


3.5.3 Overall correlation


Result: 

  • The number of rides for casuals and members are correlated by R = 0.8
  • The slope of the regression line is about 1:0.9, but we can observe a large spread the farther we move out on the axis

To find some further clues we will look into correlation by season, weekdays and hour

3.5.4 Correlations by seasons

Now let’s split the data in rides by season. The seasons are defined as:

  • winter: Jan, Feb, Mar
  • spring: Apr, May, Jun
  • summer: Jul, Aug, Sep
  • autumn: Oct, Nov, Dec


Result:

  • The correlation values for all seasons are between R = 0.7 ~ 0.8, we can’t specify differences between casuals and members due to seasons
  • The slopes are a little steeper for winter (1:1.2) and autumn (1:1.3), i.e. trend to more rides by members than by casuals
  • The slopes for summer are close to 1:1, summer (1:0.8) and spring (1:0.9), i.e. trend to equal number of rides for members and casuals

3.5.5 Correlations by weekday

Next let’s split the data in rides by day-type. The day-types are defined as:

  • weekend: Sat, Sun
  • workday: Mon, Tue, Wed, Thu, Fri


Result: 

  • The correlation on weekend (R=0.94) is stronger than on workdays (R=0.85), i.e. ride behavior on workdays shows more differences between the user groups
  • The slop on weekends is 1:0.7, i.e. trend to more casuals than members
  • The slop on workdays is 1:1.2, i.e. trend to more members than casuals

3.5.6 Correlation by day time

Finally let’s split the data in rides by day time. The day times is defined as:

  • night : 00:01 - 06:00
  • morning : 06:01 - 12:00 (morning commute)
  • afternoon : 12:01 - 18:00 (afternoon commute)
  • evening : 18:01 - 00:00


Results: 

  • The correlation in the morning hours is weak (R=0.65), i.e.in the morning hours we can observe more differences in ride behavior between casuals and members
  • The correlations in the afternoon, evening and night hours is about R=0.8 and correlated
  • The slops for morning hours and evening hours is 1:0.9, i.e. trend to equal number of members and casuals
  • The slop for afternoon hours is 1:0.8, i.e. trend to more casual rides
  • The slop for night hours is flat (1:0.5), i.e. trend to more casual rides

3.5.7 Conclusions for correlation between casuals and members

The relationship of ride numbers between casual and member user were analyzed by simple linear regression models segmented into season, weekdays and hours. All models were significant (very small p-values): The models verify our findings from the time series in chapter 3.2:

  • There are no significant difference of user behavior related to season
  • The ride behavior on workdays shows more difference between the user groups
  • In the morning hours a clear difference in ride behavior between casuals and members can be observed


4. Answer the question

How do annual members and casual riders use Cyclistic bikes differently?

4.1 Differences between users

Overall:

  • Annual members ride more than casual riders over the year
  • Casual riders accumulate more ride time over the year
  • The median ride-time of casual riders is longer

By months:

  • Both groups show an increase of rides in warmer season and decrease in colder season
  • However, in case of casual riders the change is more extreme, i.e. more rides in summer and only very few rides in winter

By week:

  • Casuals prefer riding on weekends and for longer time
  • Members prefer riding on workdays, their ride-time is constant over the week

By day:

  • Members prefer riding during commute time in the morning and afternoon hours, indicating that member use their bikes primarily for commuting
  • Casuals use their bikes primarily in the afternoon, indicating that they use it more for leisure activities

By bike type:

  • Casuals favor electric bikes more than members
  • On summer weekends casuals use more electric bikes than members
  • Casuals use electric bike to some extend also for the morning commute, indicating that a portion of casual riders could be interested in a membership with a seasonal pass

By location:

  • Casuals have a preference for locations along the lake shore, in park areas and in the city
  • Members use station all over greater Chicago area with a concentration in the city’s business districts and on university campuses


4.2 Recommendations:

Scenario 1: Introduction of Seasonal Memberships

  • Casual riders show a distinct ride preference from June to September and on weekends.
  • Therefore, we recommend the introduction of seasonal passes for the warmer season and for weekends.

Scenario 2: Introduction of Benefit Program for Electric Bikes

  • Casual riders prefer to use more electric bikes than members. A smaller but significant portion of casual riders use electric bikes during the morning commute hours. They might be interested in attractive programs targeting especially electric bikes. This could be combined with seasonal membership to attract more casual riders.

Scenario 3: Convert Casual Riders to Annual Memberships

  • Since casuals’ ride pattern distinctively differs from those of members, it will be difficult to convert casual rider into members even with extensive promotion programs. We therefore do not recommend this path.


Thank you for your interest !